package cn.piesat.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import javax.annotation.PostConstruct;

/**
 * Jedis连接池初始化，获取Jedis实例，放回实例
 *
 * @author 奚好雷
 */
@Component
public class JedisUtils {

    /**
     * Redis数据库索引
     */
    @Value("${spring.redis.database}")
    private Integer database;

    /**
     * Redis服务器地址
     */
    @Value("${spring.redis.host}")
    private String host;

    /**
     * Redis服务器连接地址
     */
    @Value("${spring.redis.port}")
    private Integer port;

    /**
     * Redis服务器连接密码
     */
    @Value("${spring.redis.password}")
    private String password;

    /**
     * 连接池最大连接数（使用负值表示没有限制）
     */
    @Value("${spring.redis.jedis.pool.max-active}")
    private Integer maxActive;

    /**
     * 连接池最大阻塞等待时间（使用负值表示没有限制）
     */
    @Value("${spring.redis.jedis.pool.max-wait}")
    private Long maxWait;

    /**
     * 连接池中的最大空闲连接
     */
    @Value("${spring.redis.jedis.pool.max-idle}")
    private Integer maxIdle;

    /**
     * 连接池中的最小空闲连接
     */
    @Value("${spring.redis.jedis.pool.min-idle}")
    private Integer minIdle;

    /**
     * 连接超时时间（毫秒）
     */
    @Value("${spring.redis.timeout}")
    private Integer timeout;

    /**
     * JedisPool对象
     */
    private static JedisPool jedisPool = null;

    /**
     * 初始化连接池
     */
    @PostConstruct
    private void init() {
        //初始化JedisPool配置
        JedisPoolConfig config = initConfig();
        setJedisPool(new JedisPool(config,host,port,timeout,password,database));
    }

    /**
     * 获取Jedis实例
     * 获取前，进行非空判断，如果JedisPool为空则返回null
     *
     * @return Jedis or null
     */
    public static synchronized Jedis getJedis() {
        if (jedisPool != null) {
            return jedisPool.getResource();
        }
        return null;
    }

    /**
     * 释放jedis连接
     * 释放前进行非空判断
     *
     * @param jedis Jedis对象
     */
    public static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    /**
     * 初始化JedisPool配置参数
     * @return
     */
    private JedisPoolConfig initConfig() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        config.setMaxTotal(maxActive);
        config.setMaxWaitMillis(maxWait);
        return config;
    }

    private static void setJedisPool(JedisPool jedisPool) {
        JedisUtils.jedisPool = jedisPool;
    }
}
